<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>[1.20]-DB操作：数据库基本操作速查 | PhalApi(π框架) - PHP轻量级开源接口框架 - 助你创造价值！</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <meta content="yes" name="apple-mobile-web-app-capable">
    <meta content="black" name="apple-mobile-web-app-status-bar-style">
    <meta content="telephone=no" name="format-detection">
    <meta content="email=no" name="format-detection">
    <meta name="Author" content="PhalApi,ecitlm,dogstar">
    <meta name="description" content="[1.20]-DB操作：数据库基本操作速查，PhalApi是一个PHP轻量级开源接口框架，致力于快速开发接口服务。支持HTTP/SOAP/RPC等协议，可用于搭建接口/微服务/RESTful接口/Web Services。我们不断更新，保持生气；为接口负责，为开源负责！并承诺永久免费！">
    <meta name="keywords" content="PhalApi,phalapi,phalapi接口开发,后台接口开发,后台接口开发框架,接口开发,接口框架,开源接口框架,PHP后台接口开发,PHP接口开发,PHP接口框架,PHP后台接口框架,phalapi官网,PHP接口框架,php接口开发框架,php接口开发,php web框架,π框架,π开发框架,π接口框架,π接口开发框架,api接口,php接口,,PHP接口框架,phalapi文档,phalapi wiki,PhalApi文档,phalapi在线文档,phalapi官方文档">

    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" media="screen">
    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css" media="screen">
    <link rel="stylesheet" href="../css/main.css" />
    <link rel="stylesheet" href="../css/loading_bar.css" />
    <link rel="icon" href="http://webtools.qiniudn.com/dog_catch.png" type="image/x-icon" />
    <script src="../js/pace.min.js"></script>
	
	<!-- 代码高亮 -->
	<link rel="stylesheet" href="../css/highlight.min.css">
	<script src="../js/highlight.min.js"></script>
	<script>hljs.initHighlightingOnLoad();</script>
    
</head>

<body>
    <!-- navbar start -->
    <div class="navbar navbar-default navbar-fixed-top" id="mainnav" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand website_name" href="/"><!-- <span>PhalApi</span> --><strong></strong></a>
            </div>
            <div class="navbar-collapse collapse" aria-expanded="false" style="height: 1px;">
                <ul class="nav navbar-nav navbar-right" id="nav_bar">
                    <li><a href="https://www.phalapi.net/"><span class="glyphicon glyphicon-home"></span></a></li>
                    <li><a href="https://www.phalapi.net/download.html">下载</a></li>
                    <li class="active"><a href="https://www.phalapi.net/wikis/">文档</a></li>
                    <li><a href="https://www.phalapi.net/donate.html">贡献</a></li>
                    <li><a href="#">|</a></li>
                    <li><a href="http://qa.phalapi.net/" target="_blank">社区</a></li>
                    <li><a href="http://www.ituring.com.cn/book/2405" target="_blank">书籍</a></li>
                    <li><a href="http://demo.phalapi.net/listAllApis.php" target="_blank">体验</a></li>
                    <li><a href="https://github.com/phalapi/phalapi-library" target="_blank">扩展</a></li>
                </ul>
            </div>
            <!--/.nav-collapse -->
        </div>
    </div>
    <!-- navbar end -->


    <div id="content">
        <div class="container">
            <div class="row row-md-flex row-md-flex-wrap">
                <h4><a href="/wikis/%5B1.19%5D-DI%E6%9C%8D%E5%8A%A1%E9%80%9F%E6%9F%A5%EF%BC%9A%E5%90%84%E8%B5%84%E6%BA%90%E6%9C%8D%E5%8A%A1%E4%B8%80%E8%A7%88%E8%A1%A8.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B1.21%5D-%E7%B1%BB%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8A%A0%E8%BD%BD%EF%BC%9A%E9%81%B5%E5%BE%AAPEAR%E5%8C%85%E7%9A%84%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83.html">下一章</a></h4>
<hr />
<p><em>一花一世界，<br />
一沙一天国，<br />
君掌盛无边，<br />
刹那含永劫。</em></p>
<p><em>-- 《天真的预兆》</em></p>
<h2>1.20.1 前提</h2>
<p>为了让大家更为明确数据库NotORM的使用，我们假设有以下数据库表：</p>
<pre><code class="language-sql">-- ----------------------------
-- Table structure for `tbl_user`
-- ----------------------------
DROP TABLE IF EXISTS `tbl_user`;
CREATE TABLE `tbl_user` (
  `id` int(11) NOT NULL,
  `name` varchar(45) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `note` varchar(45) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tbl_user
-- ----------------------------
INSERT INTO `tbl_user` VALUES ('1', 'dogstar', '18', 'oschina', '2015-12-01 09:42:31');
INSERT INTO `tbl_user` VALUES ('2', 'Tom', '21', 'USA', '2015-12-08 09:42:38');
INSERT INTO `tbl_user` VALUES ('3', 'King', '100', 'game', '2015-12-23 09:42:42');</code></pre>
<p>并且，假设我们已获得了tbl_user表对应的notorm实例$user，此NotORM表实例可从两种方式获得：  </p>
<ul>
<li>1、使用原生态的notorm，即：$user = DI()-&gt;notorm-&gt;user  </li>
<li>2、使用PhalApi_Model_NotORM基类的方式，即：$user = $this-&gt;getORM()，如：</li>
</ul>
<pre><code class="language-php">&lt;?php
class Model_User extends PhalApi_Model_NotORM {
    protected function getTableName($id) {
        return 'user';
    }

    public function doSth() {
        $user = $this-&gt;getORM(); //获取NotORM表实例
    }
}</code></pre>
<h2>写在前面的话</h2>
<p>NotORM的实例是有内部状态的，因为在开发过程中，需要特别注意何时需要保留状态（使用同一个实例）、何时不需要保留状态。即：  </p>
<p>保留状态的写法：  </p>
<pre><code class="language-php">$user = $notorm-&gt;user;  //获取一个新的实例
$user-&gt;where('age &gt; ?', 18);
$user-&gt;where('name LIKE ?', '%dog%');  //相当于age &gt; 18 AND name LIKE '%dog%'</code></pre>
<p>不保留状态的写法：</p>
<pre><code class="language-php">$user = $notorm-&gt;user;  //获取一个新的实例
$user-&gt;where('age &gt; ?', 18);

$user = $notorm-&gt;user;  //重新获取新的实例
$user-&gt;where('name LIKE ?', '%dog%');  //此时只有 name LIKE '%dog%'</code></pre>
<p>关于这两者的使用场景，下面在进行说明时会特别提及。<br />
下面，就让我们结合实例来尝试一下数据库的操作吧！</p>
<h3>调试模式</h3>
<h4>(1)打印SQL语句</h4>
<p>在请求接口时，当需要查看当前接口所执行的SQL语句时，可以添加参数<code>&amp;__sql__=1</code>。如请求：</p>
<pre><code>http://demo.phalapi.net/?service=User.getBaseInfo&amp;user_id=1&amp;__sql__=1</code></pre>
<p>会返回类似这样：</p>
<pre><code class="language-html">[1 - 0.00035s]SELECT * FROM tbl_user WHERE (id = ?); -- 1&lt;br&gt;
{"ret":200,"data":{"code":0,"msg":"","info":{"id":"1","name":"dogstar","note":"oschina"}},"msg":""}</code></pre>
<h4>(2)显示数据库连接错误的详细信息</h4>
<p>普通情况下，数据库连接失败时会这样提示：</p>
<pre><code class="language-html">{
    "ret": 500,
    "data": [],
    "msg": "服务器运行错误: 数据库db_demo连接失败"
}</code></pre>
<p>考虑到生产环境不方便爆露服务器的相关信息，故这样简化提示。当在开发过程中，需要定位数据库连接失败的原因时，可使用debug调试模式。<br />
开启调试模式的方法有两种：  </p>
<ul>
<li>1、在请求接口时添加 <code>&amp;__debug__=1</code>，开启本次调试  </li>
<li>2、将配置文件 <code>./Config/sys.php</code>中的debug设置为true，开启全局调试  </li>
</ul>
<p>开启后，当再次失败时，会看到类似这样的提示：  </p>
<pre><code>{
    "ret": 500,
    "data": [],
    "msg": "服务器运行错误: 数据库db_demo连接失败，异常码：1045，错误原因：SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: NO)"
}</code></pre>
<p>然后，便可根据具体的错误提示进行排查解决。  </p>
<h3>默认表名与指定表名</h3>
<p><strong>请注意：PhalApi v1.3.4 版本以上有效。</strong>  </p>
<p>当继承PhalApi_Model_NotORM时，如编写Model_User类：  </p>
<pre><code class="language-php">&lt;?php
class Model_User extends PhalApi_Model_NotORM {
}</code></pre>
<p>则默认的表名为：<code>user</code>。默认表名的自动匹配规则是：取<code>Model_</code>后面部分的字符全部转小写。转化后框架会另外加上表前缀。    </p>
<p>在以下场景下，需要重写此方法以指定表名：  </p>
<ul>
<li>自动匹配的表名与实际表名不符</li>
<li>存在分表</li>
<li>Model类名不含有Model_  </li>
</ul>
<p>如，当Model_User类对应的表名为：my_user表时，可使用<code>getTableName($id)</code>重新指定表名：  </p>
<pre><code class="language-php">&lt;?php
class Model_User extends PhalApi_Model_NotORM {
    protected function getTableName($id) {
        return 'my_user'; 
    }
}</code></pre>
<h2>1.20.2 基本操作</h2>
<h3>(1)SELECT</h3>
<h4>单个字段：</h4>
<pre><code class="language-php">// SELECT id FROM `tbl_user`
$user-&gt;select('id') </code></pre>
<h4>多个字段获取：</h4>
<pre><code class="language-php">// SELECT id, name, age FROM `tbl_user`
$user-&gt;select('id, name, age') </code></pre>
<h4>字段别名获取：</h4>
<pre><code class="language-php">// SELECT id, name, MAX(age) AS max_age FROM `tbl_user`
$user-&gt;select('id, name, MAX(age) AS max_age') </code></pre>
<h4>全部字段（缺省）获取：</h4>
<pre><code class="language-php">// SELECT * FROM `tbl_user`
$user-&gt;select('*') </code></pre>
<h3>(2)WHERE</h3>
<h4>单个字段查询：</h4>
<pre><code class="language-php">// WHERE id = 1
$user-&gt;where('id', 1)
$user-&gt;where('id = ?', 1)
$user-&gt;where(array('id', 1))</code></pre>
<h4>多个字段查询：</h4>
<pre><code class="language-php">// WHERE id &gt; 1 AND age &gt; 18
$user-&gt;where('id &gt; ?', 1)-&gt;where('age &gt; ?', 18)
$user-&gt;and('id &gt; ?', 1)-&gt;and('age &gt; ?', 18)
$user-&gt;where('id &gt; ? AND age &gt; ?', 1, 18)
$user-&gt;where(array('id &gt; ?' =&gt; 1, 'age &gt; ?' =&gt; 10))

// WHERE name = 'dogstar' AND age = 18
$user-&gt;where(array('name' =&gt; 'dogstar', 'age' =&gt; 18))

// WHERE name = 'dogstar' OR age = 18
$user-&gt;or('name', 'dogstar')-&gt;or('age', 18)

// WHERE ((name = ? OR id = ?)) AND (note = ?) -- 'dogstar', '1', 'xxx'
#实现方式1：使用and拼接
$user-&gt;where('(name = ? OR id = ?)', 'dogstar', '1')-&gt;and('note = ?', 'xxx')
#实现方式2：只使用where，不用数组传参
$user-&gt;where('(name = ? OR id = ?) AND note = ?', 'dogstar', '1', 'xxx')
#实现方式3：只使用where，用下标为顺序数字的数组传参
$user-&gt;where('(name = ? OR id = ?) AND note = ?', array('dogstar', '1', 'xxx'))
#实现方式4：只使用where，用下标为标识符的数组传参
$user-&gt;where('(name = :name OR id = :id) AND note = :note', array(':name' =&gt; 'dogstar', ':id' =&gt; '1', ':note' =&gt; 'xxx'))</code></pre>
<h4>IN查询：</h4>
<pre><code class="language-php">// WHERE id IN (1, 2, 3)
$user-&gt;where('id', array(1, 2, 3))

// WHERE id NOT IN (1, 2, 3)
$user-&gt;where('NOT id', array(1, 2, 3))

// WHERE (id, age) IN ((1, 18), (2, 20))
$user-&gt;where('(id, age)', array(array(1, 18), array(2, 20)))</code></pre>
<h4>模糊匹配查询：</h4>
<pre><code class="language-php">// WHERE name LIKE '%dog%'
$user-&gt;where('name LIKE ?', '%dog%')

// WHERE name NOT LIKE '%dog%'
$user-&gt;where('name NOT LIKE ?', '%dog%')</code></pre>
<h4>NULL判断查询：</h4>
<pre><code class="language-php">// WHERE (name IS NULL)
$user-&gt;where('name', null)</code></pre>
<p>对于非空的判断，则可以：  </p>
<pre><code class="language-php">// WHERE (name IS NOT ?) LIMIT 1; -- NULL
$user-&gt;where('name IS NOT ?', null)</code></pre>
<h3>(3)ORDER BY</h3>
<h4>单个字段排序：</h4>
<pre><code class="language-php">// ORDER BY age
$user-&gt;order('age')

// ORDER BY age DESC
$user-&gt;order('age DESC')</code></pre>
<h4>多个字段排序：</h4>
<pre><code class="language-php">// ORDER BY id, age DESC
$user-&gt;order('id')-&gt;order('age DESC')
$user-&gt;order('id, age DESC')</code></pre>
<h3>(4)LIMIT</h3>
<h4>按数量限制：</h4>
<pre><code class="language-php">// LIMIT 10
$user-&gt;limit(10)</code></pre>
<h4>按数量和偏移量限制（请注意：先偏移量、再数量）：</h4>
<pre><code class="language-php">// LIMIT 2,10
$user-&gt;limit(2, 10)</code></pre>
<h3>(5)GROUP BY和HAVING</h3>
<h4>不带HAVING：</h4>
<pre><code class="language-php">// GROUP BY note
$user-&gt;group('note')</code></pre>
<h4>带HAVING：</h4>
<pre><code class="language-php">// GROUP BY note HAVING age &gt; 10
$user-&gt;group('note', 'age &gt; 10')</code></pre>
<h2>1.20.3 CURD之查询类（Retrieve）</h2>
<table class="table table-bordered">
<thead>
<tr>
<th>操作</th>
<th>说明</th>
<th>示例</th>
<th>备注</th>
<th>是否PhalApi新增</th>
</tr>
</thead>
<tbody>
<tr>
<td>fetch()</td>
<td>循环获取每一行</td>
<td>while($row = $user-&gt;fetch()) { //... }</td>
<td>否</td>
</tr>
<tr>
<td>fetchOne()</td>
<td>只获取第一行</td>
<td>$row = $user-&gt;where('id', 1)-&gt;fetchOne();</td>
<td>等效于fetchRow()</td>
<td>是</td>
</tr>
<tr>
<td>fetchRow()</td>
<td>只获取第一行</td>
<td>$row = $user-&gt;where('id', 1)-&gt;fetchRow();</td>
<td>等效于fetchOne()</td>
<td>是</td>
</tr>
<tr>
<td>fetchPairs()</td>
<td>获取键值对</td>
<td>$row = $user-&gt;fetchPairs('id', 'name');</td>
<td>第二个参数为空时，可取多个值，并且多条纪录</td>
<td>否</td>
</tr>
<tr>
<td>fetchAll()</td>
<td>获取全部的行</td>
<td>$rows = $user-&gt;where('id', array(1, 2, 3))-&gt;fetchAll();</td>
<td>等效于fetchRows()</td>
<td>是</td>
</tr>
<tr>
<td>fetchRows()</td>
<td>获取全部的行</td>
<td>$rows = $user-&gt;where('id', array(1, 2, 3))-&gt;fetchRows();</td>
<td>等效于fetchAll()</td>
<td>是</td>
</tr>
<tr>
<td>queryAll()</td>
<td>复杂查询下获取全部的行，默认下以主键为下标</td>
<td>$rows = $user-&gt;queryAll($sql, $parmas);</td>
<td>等效于queryRows()</td>
<td>是</td>
</tr>
<tr>
<td>queryRows()</td>
<td>复杂查询下获取全部的行，默认下以主键为下标</td>
<td>$rows = $user-&gt;queryRows($sql, $parmas);</td>
<td>等效于queryAll()</td>
<td>是</td>
</tr>
<tr>
<td>count()</td>
<td>查询总数</td>
<td>$total = $user-&gt;count('id');</td>
<td>第一参数可省略</td>
<td>否</td>
</tr>
<tr>
<td>min()</td>
<td>取最小值</td>
<td>$minId = $user-&gt;min('id');</td>
<td>否</td>
</tr>
<tr>
<td>max()</td>
<td>取最大值</td>
<td>$maxId = $user-&gt;max('id');</td>
<td>否</td>
</tr>
<tr>
<td>sum()</td>
<td>计算总和</td>
<td>$sum = $user-&gt;sum('age');</td>
<td>否</td>
</tr>
</tbody>
</table>
<h4>循环获取每一行（多个字段）：</h4>
<pre><code class="language-php">// SELECT id, name FROM tbl_user WHERE (age &gt; 18);
$user = $notorm-&gt;user-&gt;select('id, name')-&gt;where('age &gt; 18');
while($row = $user-&gt;fetch()) {
     var_dump($row);
}

// 输出
array(2) {
  ["id"]=&gt;
  string(1) "2"
  ["name"]=&gt;
  string(3) "Tom"
}
array(2) {
  ["id"]=&gt;
  string(1) "3"
  ["name"]=&gt;
  string(4) "King"
}</code></pre>
<h4>循环获取每一行（单个字段）：</h4>
<pre><code class="language-php">// SELECT id, name FROM tbl_user WHERE (age &gt; 18);
$user = $notorm-&gt;user-&gt;select('id, name')-&gt;where('age &gt; 18');
while($row = $user-&gt;fetch('name')) { // 指定获取name这列，但此字段须在select里
     var_dump($row);
}

// 输出
string(3) "Tom"
string(4) "King"</code></pre>
<h4>循环获取每一行（错误的用法，注意！会死循环）：</h4>
<pre><code class="language-php">while($row = $notorm-&gt;user-&gt;select('id, name')-&gt;where('age &gt; 18')-&gt;fetch('name')) {
     var_dump($row);
}</code></pre>
<h4>只获取第一行（多个字段）：</h4>
<pre><code class="language-php">// SELECT id, name FROM tbl_user WHERE (age &gt; 18) LIMIT 1;
$rs = $user-&gt;select('id, name')-&gt;where('age &gt; 18')-&gt;fetchOne();  //等同fetchRow()
var_dump($rs);

// 输出
array(2) {
  ["id"]=&gt;
  string(1) "2"
  ["name"]=&gt;
  string(3) "Tom"
}</code></pre>
<h4>只获取第一行（单个字段）：</h4>
<pre><code class="language-php">var_dump($user-&gt;fetchOne('name'));  // 输出 string(3) "Tom"
var_dump($user-&gt;fetchRow('name'));  // 等同输出 string(3) "Tom"</code></pre>
<h4>获取键值对（多个字段）：</h4>
<pre><code class="language-php">// SELECT id, name, age FROM tbl_user LIMIT 2;
$rs = $user-&gt;select('name, age')-&gt;limit(2)-&gt;fetchPairs('id'); //指定以ID为KEY
var_dump($rs);

// 输出
array(2) {
  [1]=&gt;
  array(3) {
    ["id"]=&gt;
    string(1) "1"
    ["name"]=&gt;
    string(7) "dogstar"
    ["age"]=&gt;
    string(2) "18"
  }
  [2]=&gt;
  array(3) {
    ["id"]=&gt;
    string(1) "2"
    ["name"]=&gt;
    string(3) "Tom"
    ["age"]=&gt;
    string(2) "21"
  }
}</code></pre>
<h4>获取键值对（单个字段）：</h4>
<pre><code class="language-php">// SELECT id, name FROM tbl_user LIMIT 2
var_dump($user-&gt;limit(2)-&gt;fetchPairs('id', 'name')); //通过第二个参数，指定VALUE的列

// 输出
array(2) {
  [1]=&gt;
  string(7) "dogstar"
  [2]=&gt;
  string(3) "Tom"
}</code></pre>
<h4>获取全部的行：</h4>
<pre><code class="language-php">// SELECT * FROM tbl_user
var_dump($user-&gt;fetchAll());  //全部表数据输出，输出结果略，相当于$user-&gt;fetchRows()</code></pre>
<h4>复杂查询下获取全部的行（1.3.1及以前版本默认下以主键为下标，1.3.1以后的版本则默认采用数组方式）：</h4>
<pre><code class="language-php">// SELECT name FROM tbl_user WHERE age &gt; :age LIMIT 1
$sql = 'SELECT name FROM tbl_user WHERE age &gt; :age LIMIT 1';
$params = array(':age' =&gt; 18);
$rs = $user-&gt;queryAll($sql, $params);
var_dump($rs);

// 输出
array(1) {
  [0]=&gt;
  array(1) {
    ["name"]=&gt;
    string(3) "Tom"
  }
}

// 也可以这样。。。
$sql = 'SELECT name FROM tbl_user WHERE age &gt; ? LIMIT 1';  //使用问号表示变量
$params = array(18);
$rs = $user-&gt;queryRows($sql, $params); //使用queryRows()别名
var_dump($rs);</code></pre>
<p>请注意：使用上面这种方式进行查询，需要手动填写完整的表名字，并且需要通过某个表的实例来运行。  </p>
<h4>取最小值：</h4>
<pre><code class="language-php">// SELECT MIN(age) FROM tbl_user
var_dump($user-&gt;min('age'));

// 输出
string(2) "18"</code></pre>
<h4>取最大值：</h4>
<pre><code class="language-php">// SELECT MAX(age) FROM tbl_user
var_dump($user-&gt;max('age'));

// 输出
string(3) "100"</code></pre>
<h4>计算总和：</h4>
<pre><code class="language-php">// SELECT SUM(age) FROM tbl_user
var_dump($user-&gt;sum('age'));

// 输出
string(3) "139"</code></pre>
<h2>1.20.4 CURD之插入类（Create）</h2>
<table class="table table-bordered">
<thead>
<tr>
<th>操作</th>
<th>说明</th>
<th>示例</th>
<th>备注</th>
<th>是否PhalApi新增</th>
</tr>
</thead>
<tbody>
<tr>
<td>insert()</td>
<td>插入数据</td>
<td>$user-&gt;insert($data);</td>
<td>原生态操作需要再调用insert_id()获取插入的ID</td>
<td>否</td>
</tr>
<tr>
<td>insert_multi()</td>
<td>批量插入</td>
<td>$user-&gt;insert_multi($rows);</td>
<td>可批量插入</td>
<td>否</td>
</tr>
<tr>
<td>insert_update()</td>
<td>插入/更新</td>
<td>接口签名：insert_update(array $unique, array $insert, array $update = array()</td>
<td>不存时插入，存在时更新</td>
<td>否</td>
</tr>
</tbody>
</table>
<h4>插入数据</h4>
<pre><code class="language-php">// INSERT INTO tbl_user (id, name, age, note) VALUES (4, 'PhalApi', 1, 'framework')
$data = array('id' =&gt; 4, 'name' =&gt; 'PhalApi', 'age' =&gt; 1, 'note' =&gt; 'framework');
$user-&gt;insert($data);
$id = $user-&gt;insert_id(); //必须是同一个实例，方能获取到新插入的行ID，且表必须设置了自增
var_dump($id); //新增的ID

//使用Model的写法
$model = new Model_User();
var_dump($model-&gt;insert($data)); //输出新增的ID</code></pre>
<h4>批量插入：</h4>
<pre><code class="language-php">// INSERT INTO tbl_user (name, age, note) VALUES ('A君', 12, 'AA'), ('B君', 14, 'BB'), ('C君', 16, 'CC')
$rows = array(
    array('name' =&gt; 'A君', 'age' =&gt; 12, 'note' =&gt; 'AA'),
    array('name' =&gt; 'B君', 'age' =&gt; 14, 'note' =&gt; 'BB'),
    array('name' =&gt; 'C君', 'age' =&gt; 16, 'note' =&gt; 'CC'),
);
$rs = $user-&gt;insert_multi($rows);
var_dump($rs);

// 输出
int(3) //成功插入的条数</code></pre>
<h4>插入/更新：</h4>
<pre><code class="language-php">// INSERT INTO tbl_user (id, name, age, note) VALUES (8, 'PhalApi', 1, 'framework') ON DUPLICATE KEY UPDATE age = 2
$unique = array('id' =&gt; 8);
$insert = array('id' =&gt; 8, 'name' =&gt; 'PhalApi', 'age' =&gt; 1, 'note' =&gt; 'framework');
$update = array('age' =&gt; 2);
$rs = $user-&gt;insert_update($unique, $insert, $update);
var_dump($rs); //输出影响的行数</code></pre>
<h2>1.20.5 CURD之更新类（Update）</h2>
<table class="table table-bordered">
<thead>
<tr>
<th>操作</th>
<th>说明</th>
<th>示例</th>
<th>备注</th>
<th>是否PhalApi新增</th>
</tr>
</thead>
<tbody>
<tr>
<td>update()</td>
<td>更新数据</td>
<td>$user-&gt;where('id', 1)-&gt;update($data);</td>
<td>更新异常时返回false，数据无变化时返回0，成功更新返回1</td>
<td>否</td>
</tr>
</tbody>
</table>
<h4>更新数据：</h4>
<pre><code class="language-php">// UPDATE tbl_user SET age = 2 WHERE (name = 'PhalApi');
$data = array('age' =&gt; 2);
$rs = $user-&gt;where('name', 'PhalApi')-&gt;update($data);
var_dump($rs);

// 输出
int(1) //正常影响的行数
int(0) //无更新，或者数据没变化
boolean(false) //更新异常、失败</code></pre>
<h4>更新数据（+1）：</h4>
<pre><code class="language-php">// UPDATE tbl_user SET age = age + 1 WHERE (name = 'PhalApi')
$rs = $user-&gt;where('name', 'PhalApi')-&gt;update(array('age' =&gt; new NotORM_Literal("age + 1")));
var_dump($rs); //输出影响的行数</code></pre>
<h2>1.20.6 CURD之删除类（Delete）</h2>
<table class="table table-bordered">
<thead>
<tr>
<th>操作</th>
<th>说明</th>
<th>示例</th>
<th>备注</th>
<th>是否PhalApi新增</th>
</tr>
</thead>
<tbody>
<tr>
<td>delete()</td>
<td>删除</td>
<td>$user-&gt;where('id', 1)-&gt;delete();</td>
<td>禁止无where条件的删除操作</td>
<td>否</td>
</tr>
</tbody>
</table>
<p>按条件删除，返回影响的行数：</p>
<pre><code class="language-php">// DELETE FROM tbl_user WHERE (id = 404);
$user-&gt;where('id', 404)-&gt;delete();</code></pre>
<p><strong> 注意：</strong> 如果是全表删除，框架将会禁止，并抛出异常。如：</p>
<pre><code class="language-php">// Exception: sorry, you can not delete the whole table
$user-&gt;delete();</code></pre>
<h2>参考</h2>
<p>更多请参考 <a href="http://www.notorm.com/#api">NotORM官网接口说明</a> </p>
<hr />
<h4><a href="/wikis/%5B1.19%5D-DI%E6%9C%8D%E5%8A%A1%E9%80%9F%E6%9F%A5%EF%BC%9A%E5%90%84%E8%B5%84%E6%BA%90%E6%9C%8D%E5%8A%A1%E4%B8%80%E8%A7%88%E8%A1%A8.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B1.21%5D-%E7%B1%BB%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8A%A0%E8%BD%BD%EF%BC%9A%E9%81%B5%E5%BE%AAPEAR%E5%8C%85%E7%9A%84%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83.html">下一章</a></h4><div style="float: left">
<h4>
<a href="http://qa.phalapi.net/">还有疑问？欢迎到社区提问！</a>
&nbsp;&nbsp;
<a href="http://docs.phalapi.net/#/v2.0/">切换到PhalApi 2.x 开发文档。</a>
</h4>
</div>
            </div>
        </div>
    </div>

 <!-- 广告位 -->
<div class="grid-wrapper desktop-only">
	<p align="center">
		<a href="http://7xiz2f.com1.z0.glb.clouddn.com/%E6%88%91%E7%9A%84%E5%90%8D%E5%AD%97%E5%8F%AB%EF%BC%9A%CF%80%E6%A1%86%E6%9E%B6%20-%20PhalApi%202016%E5%B9%B4%E5%BA%A6%E5%BC%80%E6%BA%90%E6%80%BB%E7%BB%93%20-%20%E5%AE%98%E6%96%B9%E5%87%BA%E5%93%81.pdf" target="blank"><img width="950" height="100" src="http://7xiz2f.com1.z0.glb.clouddn.com/ad_20170104.png"></a>
		<a href="http://www.itran.cc/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/9/69/b88bc92455dc1239f9a5bf8d72929.png"></a>
		<a href="http://web-tools.phalapi.net/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/7/d0/88f523566c482296aecc43d185ca2.png"></a>
	</p>
</div>

        <!-- footer -->
        <div class="footer">
            <div class="link container ">
                <div class=" col-xs-7 col-sm-7 col-md-7 col-lg-7 ">
                    <h3>PhalApi (π框架)</h3>
                    <p>一个轻量级PHP开源接口框架，专注于接口服务开发，支持HTTP/SOAP/RPC协议，拥有自动生成的在线文档、多种开发语言的客户端SDK包以及可重用的扩展类库，可用于快速搭建微服务、RESTful接口或Web
                        Services。</p>
                    <!-- <p>:</p> -->
                    <a href="https://www.phalapi.net/" target="_blank"> PhalApi </a>
                    <span>|</span>
                    <a href="http://qa.phalapi.net/" target="_blank">社区</a>
                    <span>|</span>
                    <a href="download.html" target="_blank">下载</a>
                    <span>|</span>
                    <a href="/wikis/">文档</a>
                    <span>|</span>
                    <a href="http://www.ituring.com.cn/book/2405" target="_blank">书籍</a>
                    <span>|</span>
                    <a href="http://demo.phalapi.net/listAllApis.php" target="_blank">体验</a>
                    <span>|</span>
                    <a href="donate.html" target="_blank">贡献</a>
                    <span>|</span>
                    <a href="https://github.com/phalapi/phalapi-library" target="_blank">扩展</a>
                    <span>|</span>
                    <a href="/license.html" target="_blank">许可</a>
                    <span>|</span>
                    <a href="/about.html" target="_blank">关于</a>
                    <span>|</span>
                    <a href="https://www.phalapi.net/wikis/en/" target="_blank">English</a>

                </div>
                <div class=" col-xs-5 col-sm-5 col-md-5 col-lg-5 contact_us ">
                    <h3>联系我们</h3>
                    <a href="https://github.com/phalapi/phalapi"><img src="../images/github.png" alt="github" /></a>
                    <a href="http://weibo.com/p/100808d236e99beb645bfb56ed1c37dde9b8bd?k=phalapi%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6&from=501&_from_=huati_topic"><img src="../images/weibo.png"  alt="weibo" /></a>
                    <a href="http://7xslqv.com1.z0.glb.clouddn.com/images/1/b0/894fde762850cb11250253f7d5ede.png"><img src="../images/zfb.png"  alt="zfb" /></a>
					<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=f16292029e59975d4ccfccc70ed87aa5c5646df512e83b0e9e1270e8368be461"><img border="0" src="images/qq.png" alt="π框架 - PhalApi交流群②" title="π框架 - PhalApi交流群②"></a>
					<a href="http://git.oschina.net/dogstar/PhalApi"><img src="../images/git-oschina.png"  alt="git-oschina" /></a>
                </div>
                <div class="cls"></div>
                <div class="text-center copy_right"> ©2015-2017 PhalApi All Rights Reserved. <a href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备15028808号</a>

				<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1255326144'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s4.cnzz.com/z_stat.php%3Fid%3D1255326144%26show%3Dpic' type='text/javascript'%3E%3C/script%3E"));</script>
                </div>
            </div>
        </div>
    </div>


    <a href="https://github.com/phalapi"><img id="gitHub_fllow" style="position: fixed; top: 0; right: 0; border: 0;z-index:9999" src="https://camo.githubusercontent.com/652c5b9acfaddf3a9c326fa6bde407b87f7be0f4/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6f72616e67655f6666373630302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png"></a>


    <script src="../js/jquery-1.11.1.min.js"></script>
    <script src="../js/bootstrap.min.js"></script>
</body>

</html>